1. 介绍
LAMP是Linux + Apache + MySQL + PHP的简写,其实就是把Apache、MySQL以及PHP安装在Linux系统上,组成一个环境来运行PHP的脚本语言,通常是网站。
我们可以把Apache+PHP安装在一台机器上,再把MySQL安装在另外一台机器上,也可以把它们三个安装在同一台机器上。但Apache和PHP需要在同一台机器上,这是因为PHP是作为Apache的一个模块存在的,它们两个必须在一起。
2. 安装
2.1. 安装MySQL
2.1.1. 实验版本
在平时安装MySQL都是源码包安装的,但是由于它的编译需要很长的时间,所以在这里选用二进制免编译包。目前比较常用的MySQL版本为mysql-5.6以上版本,但在工作场景中具体使用哪个版本还是根基具体的平台和需求而定。所以,在这里选用5.6版本的作为演示。
2.1.2. 下载软件包
可以到MySQL官网去下载MySQL的包。可以使用免编译二进制包。但是需要注意的是,这个软件包是区分平台的。CentOS7之前的版本都有区分32位和64位,但是如果使用的是CentOS7,那么直接选择64位的包下载。
查看Linux是多少位的方法:
下载源码包,如下所示:
2.1.3. 初始化
接下来的初始化过程如下:
上面的最后一个命令中,--user
表示定义数据库以哪个用户的身份在运行,--datadir
表示定义数据库的安装目录(建议放到大空间的分区上)。这个目录需要自行创建。这一步很关键,如果看到两个OK说明执行正确,否则请仔细查看错误信息。
在执行完最后上面的最后一条命令后,有时会有错误而执行失败。(即echo $?
不为0)。
错误信息是这样的:
FATAL ERROR: please install the following Perl modules before executing ./scripts/mysql_install_db: Data::Dumper
,这是因为缺少包perl-Module-Install
,使用命令yum install -y perl-Module-Install
安装它。Installing MySQL system tables..../bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
,解决方法:yum install -y libaio
- 如果还有其它错误,仔细查看错误信息,利用网络资源来解决。
2.1.4. 配置MySQL
首先复制配置文件,如下所示:
因为系统默认就有/etc/my.cnf,所以会提示是否覆盖,直接按y即可。然后打开配置文件,做一些简单的配置,把配置文件改成如下内容:
其中,basedir是MySQL包所在的路径,datadir是定义的存放数据的地方,默认情况下,错误日志也会记录在这个目录下面。port定义MySQL服务监听的端口,如果不定义默认就是3306。server_id定义该MySQL服务的ID号,这个参数用在做主从配置的时候。socket定义MySQL服务监听的套接字地址,在Linux系统下面,很多服务不仅可以监听一个端口(通过TCP/IP的方式通信),也可以监听socket,两个进程就可以通过这个socket文件通信。下面几个buffer是关于内存的配置参数,保持默认即可。
然后复制启动脚本文件并修改其属性,如下所示:
然后修改启动脚本(vim /etc/init.d/mysqld
)。需要修改的地方有basedir=/usr/local/mysql
、datadir=/data/mysql
(前面初始化数据库时定义的目录)。把启动脚本加入系统服务项,设定开机启动并启动MySQL,如下所示:
如果启动不了,请到/data/mysql/目录下查看错误日志,这个日志名通常是主机名.err
。检查MySQL是否启动的命令为:
2.2. 安装Apache
2.2.1. 实验版本
Apache其实是一个软件基金会组织的名字,早期他们开发的Web Server软件非常流行,当时名字就焦作Apache,不过后来改名字叫作httpd了。所以,大家所说的Apache其实就是在说httpd。Apache基金会下面有很多开源的软件,其中就包含了Tomcat。
可以到httpd的官网去下载合适的版本,目前使用较多的版本为2.2或者2.4。在这里选用2.4版本来进行演示。不过2.4版本有一个比较麻烦的事情,还需要手动编译安装apr以及apr-util包。其中apr(包含apr和apr-util)可以理解成一个通用的函数库,主要为上层应用提供支持。在这里,httpd是依赖apr和apr-util的,如果不安装这两个东西,httpd就无法工作。
2.2.2. 下载软件包
首先下载所需要的安装包并解压
2.2.3. 准备工作
接下来先安装apr以及apr-util
如果在安装apr-util时出现如下错误:
解决办法是:yum install -y expat-devel
2.2.4. 正式安装
安装完apr及apr-util,继续安装httpd,配置编译参数,如下所示:
这里,–prefix指定安装目录,–enable-so表示启用DSO。DSO的意思是,把某些功能以模块(一个模块就是一个so文件,这些文件在编译完httpd后就会看到)的形式展现出来。enable-mods-shared=most表示以共享的方式安装大多数功能模块,安装后会在modules目录下面看到这些文件。因为选择了大多数,所以后面的编译时间就会大大增加。
另外,为了避免在make的时候出现错误,最好提前安装好一些库文件:yum install -y pcre pcre-devel
最后编译和安装:
安装完成后,可以执行下面的命令,查看httpd的目录结构以及modules目录下面的模块文件:
这些模块并不会全部加载,如果你想使用哪个模块,在配置文件里配置即可。插卡加载了哪些模块,使用命令:
说明:
- 前面以AH0058开头的行,并不是错误,仅仅是一个警告,可在配置文件中定义ServerName使其消失。
- 这些带有shared字样的,表示该模块为动态共享模块
- 当然还有statix字样的,它表示以静态的形式存在。
- 动态和静态的区别在于,静态模块直接和主程序(/usr/local/apache2.4/bin/httpd)绑定在一起,我们看不到,而动态的模块都是一个个独立存在的文件(modules目录下面的.so文件即是)。
- 其中以mpm_开头的就是apache的mpm工作模式,2.2版本的httpd默认的mpm工作模式为prefork。除了prefork外,常见的工作模式还有worker以及event。2.4版本的httpd默认是event工作模式。
2.2.5. apache安装完后的服务启动设置
Apache安装后可通过其安装路径的bin目录下的apachectl脚本控制服务的启动和停止。服务控制脚本为:/usr/local/apache2.4/bin/apachectl
- 启动Apache服务:
/usr/local/apache2.4/bin/apachectl start
- 停止Apache服务:
/usr/local/apache2.4/bin/apachectl stop
- 开机执行启动命令:
echo "/usr/local/apache2.4/bin/apachectl start" >> /etc/rc.local
下面接受如何把Apache加入到系统服务,用service命令来控制Apache的启动和停止:
- 首先以apachectl脚本为模板生成Apache服务控制脚本:
grep -v "#" /usr/local/apache2.4/bin/apachectl > /etc/init.d/apache
编辑Apache服务控制脚本/etc/init.d/apache,在文件的最前面插入下面的内容,使其支持chkconfig命令:
123# chkconfig: 2345 85 15# description: Apache is a World Wide Webserver.保存退出后,增加Apache服务控制脚本执行权限:
chmod +x /etc/init.d/apache
- 将Apache服务加入到系统服务列表:
chkconfig --add apache
- 检查Apache服务是否成功加入:
chkconfig --list apache
- 命令输出类似这种:
apache 0:off 1:off 2:on 3:on 4:on 5:on 6:off
表明成功
- 命令输出类似这种:
- 可使用service命令控制Apache的启动和停止
- 启动Apache服务:
service apache start
- 停止Apache服务:
service apache stop
- 开机自启动Apache的运行级别为3、5:
chkconfig --level 35 apache on
- 关闭开机自启动:
chkconfig apache off
- 启动Apache服务:
2.2.6. 关于apache的几个用法
/usr/local/apache2.4/bin/apachectl -t
检查配置文件是否有错误/usr/local/apache2.4/bin/apachectl -l
查看有哪些静态模块/usr/local/apache2.4/bin/apachectl -M
查看有哪些动态模块cat /usr/local/apache2.4/build/config -nice
查看现在正在使用的apache编译时的参数/usr/local/apache2.4/bin/apachectl start
启动apache服务/usr/local/apache2.4/bin/apachectl stop
关闭apache服务/usr/local/apache2.4/bin/apachectl restart
重启apache服务/usr/local/apache2.4/bin/apachectl graceful
不停止服务重新加载配置文件
2.3. 安装PHP
2.3.1. 实验版本
为什么要把PHP放在最后来安装,是有原因的,因为我们在编译PHP的时候,有指定MySQL以及Apache的路径,如果不事先安装好MySQL和Apache就没有办法安装PHP。而Apache和MySQL的安装顺序就无所谓了。
关于PHP的版本,目前大多数企业都会使用5.4版本及更高版本,甚至越来越多的企业使用PHP7版本。7和5两个版本还是有很大差异的,据说7版本有很大的性能提升,但是毕竟7版本还是太新了,和很多企业的网站不一定能兼容。所以,在本实验中还是以5版本为主,用的是5.6的版本。可以去PHP的官网去下载。
2.3.2. 下载软件包
首先下载和解压PHP源码包,如下所示:
2.3.3. 编译安装时错误的总结
在执行编译参数这一步时可能会遇到很多错误,只有把这些错误全部解决才能正确进行下一步。下面是常见的一些错误及其解决办法:
总的来说,对于一台新机器,只需要安装上在编译过程中要用到的东西便能正常成功安装,总结下面的各个错误,只需要执行一条命令即可把所有的这些东西都安装上:yum install -y libxml2-devel openssl openssl-devel bzip2 bzip2-devel libpng libpng-devel freetype freetype-devel libmcrypt-devel libjpeg-devel
- 错误1
- configure: error: xml2-config not found. Pleasen check your libxml2 installation.
- 解决办法:
yum install -y libxml2-devel
- 错误2
- configure: error: Cannot find OpenSSL’s < evp.h>
- 解决办法:
yum install -y openssl openssl-devel
- 错误3
- checking for BZip2 in default path… not found
- configure: error: Please reinstall the BZip2 distribution
- 解决办法:
yum install -y bzip2 bzip2-devel
- 错误4
- configure: error: png.h not found
- 解决办法:
yum install -y libpng libpng-devel
- 错误5
- configure: error: freetype.h not found.
- 或 configure: error: freetype-config not found.
- 解决办法:
yum install -y freetype freetype-devel
- 错误6
- configure: error: mcrypt.h not found. Please reinstall libmcrypt.
- 解决办法:
yum install -y epel-release
、yum install -y libmcrypt-devel
- CentOS默认的yum源没有libmcrypt-devel这个包,所以只能借助epel yum源
- 错误7
- configure: error: libjpeg.(a/so) not found.
- 或 configure: error: jpeglib.h not found.
- 解决办法:
yum install -y libjpeg-devel
2.3.4. 最后的编译安装
解决编译时出现的所有错误后,就可以成功配置编译参数了:
关于PHP的编译参数比较多,暂时不需要钻牛角尖,但是大体意思是:编译PHP可以指定我们需要的功能额模块,跟Apache的类似。至于需要哪些,这取决于你所在的公司需要什么功能。上面提供的这些比较常用,如果没有特殊需求,直接使用这些参数即可。有一个地方需要注意一下,apxs为httpd的一个工具,因为有它才会自动把PHP模块安装到httpd的modules目录下,也就是说PHP将会以一个模块的形式和httpd结合在一起工作。
然后是编译和安装,如下所示:
然后复制配置文件:cp php.ini-production /usr/local/php/etc/php.ini
- 补充
- PHP的配置模板有两个,
php.ini-production
和php.ini-development
,前者是生产环境中使用的,后者是开发环境中使用的 /usr/local/php/bin/php
不能用来启动PHP服务,但是它可以用来解析PHP脚本。(注意,在LAMP中PHP不是独立的服务,所以不用启动PHP相关的服务)/usr/loca/php/bin/php -m
查看加载了哪些模块/usr/local/php/bin/php -i
查看PHP的一些信息(比如编译PHP的时候的详细参数、配置文件路径、phpinfo()等)
- PHP的配置模板有两个,
2.4. 配置httpd支持PHP
httpd的主配置文件为/usr/local/apache2.4/conf/httpd.conf,编辑这个文件:vim /usr/local/apache2.4/conf/httpd.conf
:
- 搜索
ServerName
,把#ServerName www.example.com:80
前面的井号删除,并修改成ServerName localhost:80
。 找到如下内容:
1234<Directory />AllowOverride noneRequire all denied</Directory>改成如下:修改它的目的是,允许所有的请求,如果不设置该行,则我们访问的时候会报403错误。
1234<Directory />AllowOverride noneRequire all granted</Directory>再搜索这一行
AddType application/x-gzip .gz .tgz
,在该行下面添加一行:1Addtype application/x-httpd-php .php接着再找到下面这一段:
123<IfModule dir_module>DirectoryIndex index.html</IfModule>修改成:
123<IfModule dir_module>DirectoryIndex index.html index.php</IfModule>找到
1#ServerName www.example.com:80修改成:
1ServerName localhost:80
2.5. 测试LAMP是否成功
httpd、MySQL和PHP安装之后,需要先检验httpd的配置文件是否正确,只有配置正确才可以正确解析PHP文件。
2.5.1. 测试配置文件是否正确
启动httpd之前需要先检验配置文件是否正确,如下所示:
显示Syntax OK
则说明配置正确。否则,需要修改配置文件httpd.conf。
启动httpd:/usr/local/apache2.4/bin/apachectl start
查看是否启动的命令如下:
如果显示这一行则说明已经启动了httpd。
另外,我们也可以使用curl
命令进行简单的测试,如下所示:
如果显示了这一行则说明测试成功。
2.5.2. 测试是否正确解析PHP
Apache是把PHP作为一个模块来调用的,所以可以通过查看apache是否加载了PHP相关的模块:ls /usr/local/apache/modules/libphp5.so
。
首先编写一个测试脚本,如下所示:
保存脚本后继续测试,如下所示:
如果显示以上信息则说明PHP解析正确。
2.5.3. 用浏览器通过IP访问
可以用浏览器来访问该Linux主机的IP,比如,IP为192.168.1.111,那么在浏览器输入:http://192.168.1.111/1.php
,看是否能够访问到。
如果不能访问,请检查Linux的防火墙和SeLinux设置:
iptables -nvL
如果有一些规则,则请执行下面命令来清除规则iptables -F
、service iptables save
- 关闭SeLinux:
setenforce 0
到此为止,我们把LAMP环境搭建好了。其实仅仅是安装上了软件,我们还有很多具体的配置工作要做,所以需要多多练习配置httpd和PHP。下面的内容,便是具体的用法。应该熟悉httpd的配置。
3. 补充内容:Apache解析不了PHP的解决步骤
- 第一步:检查Apache是否加载了PHP的模块
- 第二步:若上一步没有问题,则检查Apache中是否正确配置与PHP相关的配置语句
- 第三步:若上面的步骤都没有问题,则检测是否重启Apache服务
- 第四步:若还没有解决,则查看相关日志记录,查看防火墙和SELinu等配置是否正确